﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;


namespace App_Persistencia
{
    public class Insumo_Data

    {
        int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        string nombre;

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }
        float cantidad;

        public float Cantidad
        {
            get { return cantidad; }
            set { cantidad = value; }
        }

        Unidad_Medida_Data unidadMedida;

        public Unidad_Medida_Data UnidadMedida
        {
            get { return unidadMedida; }
            set { unidadMedida = value; }
        }

        string descripcion;

        public string Descripcion
        {
            get { return descripcion; }
            set { descripcion = value; }
        }

        float insumo;

        public float Insumo
        {
            get { return insumo; }
            set { insumo = value; }
        }

        //tratar de no utilizar
        public DataView popularInsumo()
        {
            //Creo la sentencia SQL
            string commandSQL = "SELECT        Insumo.ins_Id AS Id, Insumo.ins_Nombre AS Nombre, Insumo.ins_Cantidad AS Cantidad, Insumo.ins_Precio AS Precio, Insumo.ins_Descripcion AS Descripcion, Unidad_Medida.uMed_Nombre AS UnidadMedida" +
                                    "FROM            Insumo INNER JOIN " +
                         "Unidad_Medida ON Insumo.unidadMedida_Id = Unidad_Medida.uMed_Id";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Insumo");

            //creo la vista de la consulta
            DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataView = dataSet.Tables["Insumo"].DefaultView;

            // Obtengo la tabla del DataSet
            //DataTable dataTable = dataSet.Tables["Ejercicio"];

            return dataView;
        }

        public static DataTable listarInsumos()
        {
            //Creo la sentencia SQL
            string commandSQL = "SELECT        Insumo.ins_Id as Id, Insumo.ins_Nombre as Nombre, Insumo.ins_Cantidad AS Cantidad, Insumo.ins_Precio AS Precio, Insumo.ins_Descripcion AS Descripcion, Unidad_Medida.uMed_Nombre AS UnidadMedida " +
                                "FROM          Insumo INNER JOIN " +
                                               "Unidad_Medida ON Insumo.unidadMedida_Id = Unidad_Medida.uMed_Id";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Insumo");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Insumo"];

            return dataTable;

        }

        public static DataTable listarInsumosNecesarios(DateTime hasta)
        {
            //Creo la sentencia SQL//Unidad_Medida.uMed_Nombre as unidad, 
            string commandSQL = "SELECT     Insumo.ins_Id as Id, Insumo.ins_Nombre as Nombre, SUM(Alimento_Detalle.dAli_Cantidad * Menu_Detalle.dMenu_Cantidad * EventoxMenu.eveXmenu_Cantidad) " +
                                "AS Necesaria, Insumo.ins_Cantidad AS Stock, Unidad_Medida.uMed_Nombre AS Unidad " +
                                "FROM         Menu_Detalle INNER JOIN " +
                                "Menu ON Menu_Detalle.menu_Id = Menu.menu_Id INNER JOIN " +
                                "Alimento ON Menu_Detalle.alimento_Id = Alimento.ali_Id INNER JOIN " +
                                "Alimento_Detalle ON Alimento.ali_Id = Alimento_Detalle.alimento_Id INNER JOIN " +
                                "Insumo ON Alimento_Detalle.insumo_Id = Insumo.ins_Id INNER JOIN " +
                                "EventoxMenu ON Menu.menu_Id = EventoxMenu.menu_Id INNER JOIN " +
                                "Evento ON EventoxMenu.evento_Id = Evento.eve_Id INNER JOIN "+
                                "Unidad_Medida ON Insumo.unidadMedida_Id = Unidad_Medida.uMed_Id " +
                                "WHERE     (Alimento_Detalle.dAli_Cantidad IS NOT NULL) AND (Menu_Detalle.dMenu_Cantidad IS NOT NULL) AND (Evento.eve_FechaEvento BETWEEN  " +
                                "'"+ System.DateTime.Now.ToShortDateString() + "' AND '" + hasta + "') " +
                                "GROUP BY Insumo.ins_Id, Insumo.ins_Nombre, Insumo.ins_Cantidad, EventoxMenu.eveXmenu_Cantidad, Unidad_Medida.uMed_Nombre";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Insumo");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Insumo"];

            return dataTable;

        }

        public static Boolean checkIDInsumos(int i)
        {
            string commandSQL = "SELECT * " +
                                  "FROM Insumo " +
                                "WHERE ins_Id = " + i;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Insumo");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Insumo"];

            if (dataTable.Rows.Count == 1)
                return true;
            else
                return false;

	    }


        public static void updateInsumo(int id, string nom, float cant, string des, float pre, int idUM)
        {
            
            //Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            connection.Open();
            SqlTransaction transaccion = connection.BeginTransaction();
            try
            {


                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                command.Transaction = transaccion;
                command.Connection = connection;

                command.CommandText = "spUpdateInsumo";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                //establezco el parametro @usuario, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@Nombre", nom);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Cantidad", cant);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                //establesco el parametro @FechaCreacion
                param = command.Parameters.AddWithValue("@Precio", pre);
                param.DbType = DbType.Decimal;
                param.Direction = ParameterDirection.Input;

                ////establesco el parametro de salida @UsuarioId
                param = command.Parameters.AddWithValue("@Descripcion", des);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@UnidadMedidaID", idUM);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;


                param = command.Parameters.AddWithValue("@Id", id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // ejecuto el procedimiento
                command.ExecuteNonQuery();
                //recupero el valor del parametro @UsuarioId
                int IdInsumo = 0;
                IdInsumo = Convert.ToInt32(command.Parameters["@Id"].Value);

                transaccion.Commit();
                               
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        }
        
        public static void guardarInsumo(string nom, float cant, string des, float pre, int idUM)
        {
                  

            //Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            connection.Open();
            SqlTransaction transaccion = connection.BeginTransaction();
            try
            {


                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                command.Transaction = transaccion;
                command.Connection = connection;

                command.CommandText = "spCargarInsumo";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                //establezco el parametro @usuario, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@Nombre", nom);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Cantidad", cant);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                //establesco el parametro @FechaCreacion
                param = command.Parameters.AddWithValue("@Precio", pre);
                param.DbType = DbType.Decimal;
                param.Direction = ParameterDirection.Input;

                ////establesco el parametro de salida @UsuarioId
                param = command.Parameters.AddWithValue("@Descripcion", des);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@UnidadMedida", idUM);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;


                param = command.Parameters.AddWithValue("@Id", 0);                
                param.Direction = ParameterDirection.Output;

                // ejecuto el procedimiento
                command.ExecuteNonQuery();
                //recupero el valor del parametro @UsuarioId
                int IdInsumo = 0;
                IdInsumo = Convert.ToInt32(command.Parameters["@Id"].Value);

                transaccion.Commit();
                               
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        
        }

        public static void eliminarInsumo(int id)
        {
            //Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            connection.Open();
            SqlTransaction transaccion = connection.BeginTransaction();
            try
            {


                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                command.Transaction = transaccion;
                command.Connection = connection;

                command.CommandText = "spDeleteInsumo";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                //establezco el parametro @usuario, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@Id", id);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                // ejecuto el procedimiento
                command.ExecuteNonQuery();
                //recupero el valor del parametro @UsuarioId
                int IdInsumo = 0;
                IdInsumo = Convert.ToInt32(command.Parameters["@Id"].Value);

                transaccion.Commit();

            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }

        }

        //metodo para chequear si existe un insumo. chequeo por nombre
        public static Boolean checkIDInsumo(string nom)
        {
            string commandSQL = "SELECT * " +
                                  "FROM Insumo " +
                                "WHERE ins_Nombre = '" + nom + "'";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Insumo");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Insumo"];

            if (dataTable.Rows.Count == 1)
                return true;
            else
                return false;

        }

        public static int buscarID(string nom)
        {
            string commandSQL = "SELECT ins_Id " +
                                 "FROM Insumo " +
                               "WHERE ins_Nombre = '" + nom + "'";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Insumo");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Insumo"];

            return int.Parse(dataTable.Rows[0][0].ToString()); 
            
        }





       
    }
}
